import os


def generate_file_pairs(source_dir, target_dir, search_str=".pdf", target_prefix=".md"):
    """遍历源目录，查找符合条件的文件，并生成源文件与目标文件的路径对。

    Args:
        source_dir (str): 源目录路径，函数将遍历该目录下的所有文件。
        target_dir (str): 目标目录路径，函数将根据源文件的目录结构生成相应的目标文件路径。
        search_str (str, optional): 文件后缀或关键字，用于筛选符合条件的文件。默认值为 ".pdf"。
        target_prefix (str, optional): 目标文件的后缀或前缀。默认值为 ".md"。

    Yields:
        tuple: 包含源文件路径和目标文件路径的元组。

    示例:
        假设 source_dir 为 "/docs", target_dir 为 "/markdown", search_str 为 ".pdf", target_prefix 为 ".md"
        函数将遍历 "/docs" 目录下的所有 PDF 文件，并生成相应的 Markdown 文件路径对。
        例如: ("/docs/report.pdf", "/markdown/report.md")
    """
    for root, dirs, files in os.walk(source_dir):
        for file in files:
            if search_str in file:
                # 构造源文件路径
                source_file_path = os.path.join(root, file)
                # 构造目标文件路径，保持源文件的目录结构
                relative_path = os.path.relpath(root, source_dir)
                if relative_path == '.':
                    # 如果 root 与 source_dir 相同，直接使用 target_dir 作为目标文件目录
                    target_file_dir = target_dir
                else:
                    # 否则，构造目标文件目录，保持源文件的目录结构
                    target_file_dir = os.path.join(target_dir, relative_path)
                # 确保目标文件目录存在，如果不存在则创建
                os.makedirs(target_file_dir, exist_ok=True)
                # 构造目标文件路径
                file_name = os.path.splitext(file)[0]
                target_file_path = os.path.join(target_file_dir, file_name + target_prefix)
                # 生成源文件路径和目标文件路径的元组
                yield source_file_path, target_file_path


def get_suffix_including_substring(text, substring):
    """
    获取包含指定子字符串的后缀部分。

    参数:
    text (str): 原始字符串。
    substring (str): 要查找的子字符串。

    返回值:
    str: 包含子字符串的后半部分，如果子字符串不存在则返回空字符串。
    """
    parts = text.split(substring, 1)  # 只分割一次
    if len(parts) > 1:  # 如果子字符串存在
        return substring + parts[1]  # 包含子字符串
    return ""  # 如果子字符串不存在，返回空字符串


def read_file_by_page(file_path, page_separator="## ## #Page"):
    """
    按页读取文件内容，并返回每一页的内容。

    参数:
    file_path (str): 文件路径。
    page_separator (str): 分页符，默认为"## ## #Page"。

    返回值:
    generator: 生成器，每次迭代返回一页的内容。
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        # 打开文件，使用utf-8编码读取
        page_content = []
        # 初始化一个空列表，用于存储当前页的内容
        for line in file:
            # 遍历文件的每一行
            if page_separator in line:
                # 如果当前行包含分页符
                if page_content:
                    page_content += [line.split(page_separator)[0]]
                    # 如果page_content列表不为空，表示已经读取了一页内容
                    yield ''.join(page_content)
                    # 使用yield返回当前页的内容
                    page_content = []
                    # 清空page_content列表，准备读取下一页
                page_content.append(get_suffix_including_substring(line, page_separator))
            else:
                page_content.append(line)
            # 将当前行添加到page_content列表中
        if page_content:
            # 如果文件读取完毕后，page_content列表不为空
            yield ''.join(page_content)
            # 使用yield返回最后一页的内容
